﻿using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
using System.IO;

// 实现一个委托链，即一个委托可以调用多个方法。
// 任务:
// 定义一个委托 LogMessage，它接受一个 string 参数。
// 创建一个 Logger 类，使用委托链记录日志。
// 实现两个不同的日志处理方法，一个输出到控制台，一个写入到文件。
// 将这两个方法添加到委托链中，并调用委托链进行日志记录。
namespace CS_BEGINNER_TO_PROFICIENT.STD.DelegatedSTD
{
    public delegate void LogMessage(string messsgae);

    public class DelegatedSTDP10
    {
        public static void Execute()
        {
            Logger logger = new Logger(Logger.SaveLogging);
            logger.logMessage += Logger.PrintLogging;

            string msg = logger.LogError("Hello World!");
            logger.logMessage(msg);
        }

    }

    public class Logger
    {
        public LogMessage logMessage;
        private static readonly string _logFilePath = @"./../../STD/DelegatedSTD/File/application.log";

        public Logger(LogMessage logMessage)
        {
            this.logMessage = logMessage;
        }

        public string Log(string messgae, string logType) => $"{DateTime.Now} [{logType}] {messgae}";

        public string LogInfo(string message) => Log(message, "INFO");

        public string LogWarning(string message) => Log(message, "WARNING");

        public string LogError(string message) => Log(message, "ERROR");

        public static void SaveLogging(string msg)
        {
            using (var writer = new StreamWriter(_logFilePath, true))
            {
                writer.WriteLine(msg);
            }
        }

        public static void PrintLogging(string msg) => Console.WriteLine(msg);
    }
}
